Purpose

Using the bulk summarized GWPS data object, compute the WUI for each mulit-UTR gene in each perturbation. Additionally, compute average WUI for each perturbation and analyze for outliers.

Note that WUI can only be computed for detected genes. Targets with low cell recovery tend to recover fewer genes and will rely on higher expression genes. If these have a different WUI profile than lower expression genes, there could be a bias in the average WUI computed for the target. Currently, we do not attempt to model this.

Initialization

Libraries

library(magrittr)
library(tidyverse)
library(cowplot)
library(plotly)
library(ggbeeswarm)
library(SummarizedExperiment)
library(Matrix)
library(clusterProfiler)
library(org.Hs.eg.db)

Parameters

set.seed(20210818)
MIN_UMIS=1000
FILE_SE="data/se/kd6_essential_bulk_expressed.Rds"

FILE_OUT="tbl/kd6_essential_wui.xlsx"
DIR_IMG_OUT="img/kd6-essential-"

## KNOWN FACTORS
GENES_CPSF <- c("CPSF1", "CPSF2", "CPSF3", "CPSF4", "WDR33", "FIP1L1")
GENES_CF1 <- c("NUDT21", "CPSF6", "CPSF7")
GENES_CF2 <- c("PCF11", "CLP1")
GENES_CSTF <- c("CSTF1", "CSTF2", "CSTF2T", "CSTF3")
GENES_PAF <- c("PAF1", "CTR9", "RTF1")
GENES_NEF <- c("NXF1", "SRSF3", "SRSF7", "THOC5")

COLOR_MAP <- c("non-targeting"="grey",
               "CPSF complex"="#8FD979",
               "CFI complex"="purple",
               "CFII complex"="#FFAA66",
               "CSTF complex"="#F6CDA3",
               "PAF complex"="steelblue",
               "mRNA export factors"="magenta",
               "other"="black")

Helper Functions

compute_effective_count <- function (cts) {
  pct <- (cts %*% Diagonal(ncol(cts), 1/colSums(cts)))
  lpct <- pct
  lpct@x <- log2(lpct@x)
  2^(-colSums(pct*lpct))
}

Data

Loading

se_tx_target <- readRDS(FILE_SE)

Preprocessing

df_multi <- rowData(se_tx_target) %>% as_tibble %>%
    filter(utr_type_raw == 'multi') %>%
    filter(rowSums(assay(se_tx_target[transcript_id,], "counts")) >= MIN_UMIS) %>%
    mutate(ensembl_id=str_remove(gene_id, "\\.[0-9]+$")) %>%
    group_by(ensembl_id) %>%
    filter(dplyr::n() > 1) %>%
    mutate(utr_rank_expr=rank(utr_rank),
           utr_wt=(utr_rank_expr - 1)/(max(utr_rank_expr) - 1)) %>%
    ungroup() %>%
    dplyr::select(transcript_id, transcript_name, gene_id, gene_name, ensembl_id, 
           utr_rank, utr_rank_expr, utr_wt) %>%
    arrange(gene_id, utr_rank)

idx_tx <- df_multi$transcript_id

df_multi %>% distinct(ensembl_id) %>% nrow %>% 
    sprintf(fmt="Found %d targeted multi-UTR genes.")
## [1] "Found 7338 targeted multi-UTR genes."
df_multi %>% nrow %>% 
    sprintf(fmt="These consist of %d 3' UTR isoforms.")
## [1] "These consist of 23151 3' UTR isoforms."

Compute WUIs

wt_tx <- df_multi %>% dplyr::select(transcript_id, utr_wt) %>% deframe

M_gene_tx <- df_multi$ensembl_id %>% fac2sparse

cts_tx_target <- assay(se_tx_target[idx_tx,], "counts")

cts_gene_target <- M_gene_tx %*% cts_tx_target

ui_tx_target <- cts_tx_target / (t(M_gene_tx) %*% cts_gene_target)
#ui_tx_target[is.na(ui_tx_target)] <- 0

wui_gene_target <- M_gene_tx %*% Diagonal(length(wt_tx), wt_tx) %*% ui_tx_target

Compute Effective Transcripts

etx_target_all <- assay(se_tx_target, "counts") %>% compute_effective_count
etx_target_multi <- cts_tx_target %>% compute_effective_count

Target Analysis

df_targets <- colData(se_tx_target) %>% as_tibble %>%
    mutate(mean_wui=colMeans(wui_gene_target[,sgID_AB], na.rm=TRUE),
           etx_all=etx_target_all[sgID_AB],
           etx_multi=etx_target_multi[sgID_AB],
           n_genes_detected=colSums(!is.na(wui_gene_target[,sgID_AB]))) %>%
    mutate(gene_set=case_when(
        target_gene == "non-targeting" ~ "non-targeting",
        target_gene %in% GENES_CPSF ~ "CPSF complex",
        target_gene %in% GENES_CF1 ~ "CFI complex",
        target_gene %in% GENES_CF2 ~ "CFII complex",
        target_gene %in% GENES_CSTF ~ "CSTF complex",
        target_gene %in% GENES_PAF ~ "PAF complex",
        target_gene %in% GENES_NEF ~ "mRNA export factors",
        TRUE ~ "other"
    ) %>% factor(levels=c("other", "non-targeting", "CPSF complex", 
                          "CFI complex", "CFII complex", "CSTF complex",
                          "PAF complex", "mRNA export factors"))) %>%
    mutate(is_known=!gene_set %in% c("non-targeting", "other"))

Export

writexl::write_xlsx(df_targets, FILE_OUT)

Plots

WUI - All Targets

g <- df_targets %>%
    ggplot(aes(x="Perturbations", y=mean_wui)) +
    geom_violin(fill='lightgrey', size=0.2, draw_quantiles=c(0.25, 0.50, 0.75)) +
    geom_quasirandom(aes(color=gene_set, size=n_cells, text=target_gene), pch=16) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    scale_y_continuous(labels=scales::percent_format(accuracy=1)) +
    theme_bw() +
    labs(x=NULL, y="Mean WUI", color="Gene Set", size=NULL)
## Warning: Ignoring unknown aesthetics: text
ggplotly(g, tooltip=c("text", "y", "gene_set", "n_cells"))

WUI vs Effective Transcripts (All Genes)

g <- df_targets %>%
    ggplot(aes(x=mean_wui, y=etx_all, color=gene_set, text=target_gene)) +
    geom_point(aes(size=n_cells), pch=16) +
    geom_rug(size=0.1) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    theme_bw() +
    theme(legend.position="none") +
    labs(x="Mean Weighted Usage Index",
         y="Effective Transcripts (All Genes)",
         color="Gene Set")

ggplotly(g, tooltip=c("text", "gene_set", "x", "y", "n_cells"))
df_targets %>%
    ggplot(aes(x=mean_wui, y=etx_all, color=gene_set, text=target_gene)) +
    geom_point(data=filter(df_targets, gene_set == 'other'), size=0.5) +
    geom_point(data=filter(df_targets, gene_set == 'non-targeting'), size=0.5) +
    geom_point(data=filter(df_targets, is_known), size=3) +
    geom_rug(size=0.1) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    theme_bw() +
    labs(x="Mean Weighted Usage Index",
         y="Effective Transcripts (All Genes)",
         color="Gene Set")

ggsave(str_c(DIR_IMG_OUT, "wui_etx_all.pdf"), width=8, height=6, dpi=300)

WUI vs Effective Transcripts (Multi-UTR Genes)

# g <- df_targets %>%
#     ggplot(aes(x=mean_wui, y=etx_multi, color=gene_set, text=target_gene)) +
#     geom_point(aes(size=n_cells), pch=16) +
#     geom_rug(size=0.1) +
#     scale_color_manual(values=COLOR_MAP) +
#     scale_size_continuous(range=c(0.05, 3)) +
#     theme_bw() +
#     theme(legend.position="none") +
#     labs(x="Mean Weighted Usage Index",
#          y="Effective Transcripts (Multi-UTR Genes)",
#          color="Gene Set")
# 
# ggplotly(g, tooltip=c("text", "gene_set", "x", "y", "n_cells"))
df_targets %>%
    ggplot(aes(x=mean_wui, y=etx_multi, color=gene_set, text=target_gene)) +
    geom_point(data=filter(df_targets, gene_set == 'other'), size=0.5) +
    geom_point(data=filter(df_targets, gene_set == 'non-targeting'), size=0.5) +
    geom_point(data=filter(df_targets, is_known), size=3) +
    geom_rug(size=0.1) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    theme_bw() +
    labs(x="Mean Weighted Usage Index",
         y="Effective Transcripts (Multi-UTR Genes)",
         color="Gene Set")

ggsave(str_c(DIR_IMG_OUT, "wui_etx_multi.pdf"), width=8, height=6, dpi=300)

Effective Transcripts - All Genes vs Multi-Only

# g <- df_targets %>%
#     ggplot(aes(x=etx_all, y=etx_multi, color=gene_set, text=target_gene)) +
#     geom_point(aes(size=n_cells), pch=16) +
#     geom_rug(size=0.1) +
#     scale_color_manual(values=COLOR_MAP) +
#     scale_size_continuous(range=c(0.05, 3)) +
#     theme_bw() +
#     theme(legend.position="none") +
#     labs(x="Effective Transcripts (All Genes)",
#          y="Effective Transcripts (Multi-UTR Genes)",
#          color="Gene Set")
# 
# ggplotly(g, tooltip=c("text", "gene_set", "x", "y", "n_cells"))
df_targets %>%
    ggplot(aes(x=etx_all, y=etx_multi, color=gene_set, text=target_gene)) +
    geom_point(data=filter(df_targets, gene_set == 'other'), size=0.5) +
    geom_point(data=filter(df_targets, gene_set == 'non-targeting'), size=0.5) +
    geom_point(data=filter(df_targets, is_known), size=3) +
    geom_rug(size=0.1) +
    scale_color_manual(values=COLOR_MAP) +
    scale_size_continuous(range=c(0.05, 3)) +
    theme_bw() +
    labs(x="Effective Transcripts (All Genes)",
         y="Effective Transcripts (Multi-UTR Genes)",
         color="Gene Set")

ggsave(str_c(DIR_IMG_OUT, "etx_all_v_multi.pdf"), width=8, height=6, dpi=300)

Gene Set Enrichment

awui_baseline <- df_targets %>%
    filter(target_gene == 'non-targeting') %$%
    weighted.mean(mean_wui, n_cells)

awui_targets <- df_targets %>% 
    filter(target_gene != 'non-targeting', n_cells >= 20) %>%
    group_by(target_gene_id) %>%
    summarize(mean_wui=weighted.mean(mean_wui, n_cells)) %>%
    mutate(mwui_dev=mean_wui-awui_baseline) %>%
    dplyr::select(target_gene_id, mwui_dev) %>% deframe %>% sort(decreasing=TRUE)

gseBP <- gseGO(awui_targets, ont="BP", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## Warning in fgseaMultilevel(...): For some pathways, in reality P-values are less
## than 1e-10. You can set the `eps` argument to zero for better estimation.
## leading edge analysis...
## done...
gseMF <- gseGO(awui_targets, ont="MF", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## Warning in fgseaMultilevel(...): For some pathways, in reality P-values are less
## than 1e-10. You can set the `eps` argument to zero for better estimation.
## leading edge analysis...
## done...
gseCC <- gseGO(awui_targets, ont="CC", OrgDb=org.Hs.eg.db, keyType="ENSEMBL", nPermSimple=1e4)
## preparing geneSet collections...
## GSEA analysis...
## Warning in fgseaMultilevel(...): For some pathways, in reality P-values are less
## than 1e-10. You can set the `eps` argument to zero for better estimation.
## leading edge analysis...
## done...

Biological Process

dotplot(gseBP, showCategory=200, split=".sign") + 
    facet_grid(.~.sign)

ridgeplot(gseBP, showCategory=200) + 
    labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00111

emapplot(enrichplot::pairwise_termsim(gseBP), showCategory=Inf)

df_genesets <- gseBP@result

for (i in seq(nrow(df_genesets))) {
    gseaplot(gseBP, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
        print()
}

Cellular Component

dotplot(gseCC, showCategory=200, split=".sign") + 
    facet_grid(.~.sign)

ridgeplot(gseCC, showCategory=200) + 
    labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.000809

emapplot(enrichplot::pairwise_termsim(gseCC), showCategory=Inf)

df_genesets <- gseCC@result

for (i in seq(nrow(df_genesets))) {
    gseaplot(gseCC, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
        print()
}

Molecular Function

dotplot(gseMF, showCategory=200, split=".sign") + 
    facet_grid(.~.sign)

ridgeplot(gseMF, showCategory=200) + 
    labs(x = "Deviation from Baseline AWUI")
## Picking joint bandwidth of 0.00101

emapplot(enrichplot::pairwise_termsim(gseMF), showCategory=Inf)

df_genesets <- gseMF@result

for (i in seq(nrow(df_genesets))) {
    gseaplot(gseMF, by='all', geneSetID=i, title=df_genesets[i, "Description"]) %>%
        print()
}

Conclusion

WUI appears to be sufficient to capture the major transcript-level action we had seen previously with contrasting simply proximal and distal transcripts.


Runtime Details

Session Info

## R version 4.1.1 (2021-08-10)
## Platform: x86_64-apple-darwin13.4.0 (64-bit)
## Running under: macOS Big Sur 10.16
## 
## Matrix products: default
## BLAS/LAPACK: /Users/mfansler/miniconda3/envs/bioc_3_14/lib/libopenblasp-r0.3.18.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] stats4    stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] org.Hs.eg.db_3.14.0         AnnotationDbi_1.56.1       
##  [3] clusterProfiler_4.2.0       Matrix_1.3-4               
##  [5] SummarizedExperiment_1.24.0 Biobase_2.54.0             
##  [7] GenomicRanges_1.46.0        GenomeInfoDb_1.30.0        
##  [9] IRanges_2.28.0              S4Vectors_0.32.0           
## [11] BiocGenerics_0.40.0         MatrixGenerics_1.6.0       
## [13] matrixStats_0.61.0          ggbeeswarm_0.6.0           
## [15] plotly_4.10.0               cowplot_1.1.1              
## [17] forcats_0.5.1               stringr_1.4.0              
## [19] dplyr_1.0.8                 purrr_0.3.4                
## [21] readr_2.1.1                 tidyr_1.1.4                
## [23] tibble_3.1.7                ggplot2_3.3.5              
## [25] tidyverse_1.3.1             magrittr_2.0.3             
## 
## loaded via a namespace (and not attached):
##   [1] readxl_1.3.1           shadowtext_0.1.2       backports_1.4.0       
##   [4] fastmatch_1.1-3        systemfonts_1.0.3      plyr_1.8.7            
##   [7] igraph_1.2.9           lazyeval_0.2.2         splines_4.1.1         
##  [10] crosstalk_1.2.0        BiocParallel_1.28.0    digest_0.6.29         
##  [13] yulab.utils_0.0.5      htmltools_0.5.2        GOSemSim_2.20.0       
##  [16] viridis_0.6.2          GO.db_3.14.0           fansi_0.5.0           
##  [19] memoise_2.0.1          tzdb_0.2.0             Biostrings_2.62.0     
##  [22] graphlayouts_0.8.1     modelr_0.1.8           enrichplot_1.14.1     
##  [25] colorspace_2.0-2       blob_1.2.2             rvest_1.0.2           
##  [28] ggrepel_0.9.1          textshaping_0.3.6      haven_2.4.3           
##  [31] xfun_0.30              crayon_1.4.2           RCurl_1.98-1.5        
##  [34] jsonlite_1.7.2         scatterpie_0.1.8       ape_5.6-2             
##  [37] glue_1.6.2             polyclip_1.10-0        gtable_0.3.0          
##  [40] zlibbioc_1.40.0        XVector_0.34.0         DelayedArray_0.20.0   
##  [43] scales_1.1.1           DOSE_3.20.0            DBI_1.1.1             
##  [46] Rcpp_1.0.7             viridisLite_0.4.0      gridGraphics_0.5-1    
##  [49] tidytree_0.4.0         bit_4.0.4              htmlwidgets_1.5.4     
##  [52] httr_1.4.2             fgsea_1.20.0           RColorBrewer_1.1-2    
##  [55] ellipsis_0.3.2         pkgconfig_2.0.3        farver_2.1.0          
##  [58] sass_0.4.0             dbplyr_2.1.1           utf8_1.2.2            
##  [61] labeling_0.4.2         ggplotify_0.1.0        tidyselect_1.1.1      
##  [64] rlang_1.0.2            reshape2_1.4.4         munsell_0.5.0         
##  [67] cellranger_1.1.0       tools_4.1.1            cachem_1.0.6          
##  [70] downloader_0.4         cli_3.3.0              generics_0.1.1        
##  [73] RSQLite_2.2.8          ggridges_0.5.3         broom_0.8.0           
##  [76] evaluate_0.15          fastmap_1.1.0          ragg_1.2.1            
##  [79] yaml_2.2.1             ggtree_3.2.0           knitr_1.39            
##  [82] bit64_4.0.5            fs_1.5.2               tidygraph_1.2.1       
##  [85] KEGGREST_1.34.0        ggraph_2.0.6           nlme_3.1-153          
##  [88] aplot_0.1.7            DO.db_2.9              xml2_1.3.3            
##  [91] compiler_4.1.1         rstudioapi_0.13        beeswarm_0.4.0        
##  [94] png_0.1-7              reprex_2.0.1           treeio_1.18.0         
##  [97] tweenr_2.0.0           bslib_0.3.1            stringi_1.7.6         
## [100] highr_0.9              lattice_0.20-45        vctrs_0.4.1           
## [103] pillar_1.7.0           lifecycle_1.0.1        jquerylib_0.1.4       
## [106] data.table_1.14.2      bitops_1.0-7           patchwork_1.1.1       
## [109] qvalue_2.26.0          R6_2.5.1               gridExtra_2.3         
## [112] writexl_1.4.0          vipor_0.4.5            MASS_7.3-54           
## [115] assertthat_0.2.1       withr_2.4.3            GenomeInfoDbData_1.2.7
## [118] parallel_4.1.1         hms_1.1.1              grid_4.1.1            
## [121] ggfun_0.0.7            rmarkdown_2.11         ggnewscale_0.4.7      
## [124] ggforce_0.3.3          lubridate_1.8.0

Conda Environment

## Conda Environment YAML
name: base
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - anaconda-client=1.8.0=pyhd8ed1ab_0
  - anaconda-project=0.10.2=pyhd8ed1ab_0
  - attrs=21.2.0=pyhd8ed1ab_0
  - awscli=1.25.79=py39h6e9494a_0
  - backports=1.0=py_2
  - backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0
  - backports.zoneinfo=0.2.1=py39h701faf5_5
  - bagit=1.8.1=pyhd8ed1ab_0
  - bagit-profile=1.3.1=pyhd8ed1ab_0
  - bdbag=1.6.1=pyhd8ed1ab_0
  - beautifulsoup4=4.9.3=pyhb0f4dca_0
  - blinker=1.4=py_1
  - boa=0.11.0=pyha770c72_3
  - boolean.py=3.7=py_0
  - boto3=1.24.78=pyhd8ed1ab_0
  - botocore=1.27.78=pyhd8ed1ab_0
  - brotlipy=0.7.0=py39h63b48b0_1004
  - bzip2=1.0.8=h0d85af4_4
  - c-ares=1.18.1=h0d85af4_0
  - ca-certificates=2022.9.24=h033912b_0
  - cairo=1.16.0=he43a7df_1008
  - cctools=973.0.1=hd9211c8_2
  - cctools_osx-64=973.0.1=h3e07e27_2
  - certifi=2022.9.24=pyhd8ed1ab_0
  - cffi=1.15.1=py39hae9ecf2_0
  - chardet=5.0.0=py39h6e9494a_0
  - charset-normalizer=2.0.0=pyhd8ed1ab_0
  - click=8.1.3=py39h6e9494a_0
  - clyent=1.2.2=py_1
  - colorama=0.4.3=py_0
  - commonmark=0.9.1=py_0
  - conda=4.14.0=py39h6e9494a_0
  - conda-build=3.21.9=py39h6e9494a_1
  - conda-forge-pinning=2021.10.10.22.03.30=hd8ed1ab_0
  - conda-libmamba-solver=22.6.0=pyhd8ed1ab_0
  - conda-pack=0.6.0=pyhd3deb0d_0
  - conda-package-handling=1.9.0=py39ha30fb19_0
  - conda-smithy=3.17.2=pyhd8ed1ab_0
  - conda-standalone=4.10.3=h694c41f_0
  - conda-suggest=0.1.1=pyh9f0ad1d_0
  - conda-suggest-conda-forge=2021.8.24=h694c41f_0
  - conda-verify=3.1.1=py39h6e9494a_1004
  - constructor=3.3.1=py39h6e9494a_0
  - cryptography=37.0.4=py39h9c2a9ce_0
  - curl=7.83.1=h372c54d_0
  - dataclasses=0.8=pyhc8e2a94_3
  - dbus=1.13.6=ha13b53f_2
  - deprecated=1.2.12=pyh44b312d_0
  - docutils=0.16=py39h6e9494a_3
  - expat=2.4.1=he49afe7_0
  - ffq=0.2.1=pyhdfd78af_0
  - filelock=3.0.12=pyh9f0ad1d_0
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=hab24e00_0
  - fontconfig=2.13.1=h10f422b_1005
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - freetype=2.10.4=h4cff582_1
  - fribidi=1.0.10=hbcb3906_0
  - frozendict=2.3.4=py39h701faf5_0
  - future=0.18.2=py39h6e9494a_5
  - gawk=5.1.0=h8a989fb_0
  - gdk-pixbuf=2.42.6=h2e6141f_0
  - gettext=0.19.8.1=hd1a6beb_1008
  - giflib=5.2.1=hbcb3906_2
  - git=2.33.0=pl5321h9a53687_2
  - git-lfs=2.13.3=h694c41f_0
  - gitdb=4.0.7=pyhd8ed1ab_0
  - gitpython=3.1.18=pyhd8ed1ab_0
  - glib=2.70.2=hcf210ce_0
  - glib-tools=2.70.2=hcf210ce_0
  - glob2=0.7=py_0
  - globus-sdk=2.0.1=pyhd8ed1ab_0
  - gmp=6.2.1=h2e338ed_0
  - gnutls=3.6.13=h756fd2b_1
  - graphite2=1.3.13=h2e338ed_1001
  - harfbuzz=2.9.0=h159f659_0
  - htop=3.2.1=h398481e_0
  - htslib=1.15=hc057d7f_0
  - hub=2.14.2=hc7d050b_0
  - icu=68.1=h74dc148_0
  - idna=3.1=pyhd3deb0d_0
  - importlib-metadata=4.11.4=py39h6e9494a_0
  - importlib_metadata=4.11.4=hd8ed1ab_0
  - importlib_resources=5.4.0=pyhd8ed1ab_0
  - inotify_simple=1.3.5=pyha770c72_3
  - ipython_genutils=0.2.0=py_1
  - isodate=0.6.0=py_1
  - jbig=2.1=h0d85af4_2003
  - jinja2=3.0.1=pyhd8ed1ab_0
  - jmespath=0.10.0=pyh9f0ad1d_0
  - joblib=1.0.1=pyhd8ed1ab_0
  - jpeg=9d=hbcb3906_0
  - json5=0.9.5=pyh9f0ad1d_0
  - jsonschema=4.3.1=pyhd8ed1ab_0
  - jupyter_core=4.11.1=py39h6e9494a_0
  - krb5=1.19.3=hb49756b_0
  - ld64=609=hd2e7500_2
  - ld64_osx-64=609=h2487922_2
  - ldid=2.1.2=h6a69015_3
  - lerc=2.2.1=h046ec9c_0
  - libarchive=3.5.2=h2b60450_0
  - libcurl=7.83.1=h372c54d_0
  - libcxx=14.0.6=hccf4f1f_0
  - libdeflate=1.10=h0d85af4_0
  - libedit=3.1.20191231=h0678c8f_2
  - libev=4.33=haf1e3a3_1
  - libffi=3.4.2=h0d85af4_5
  - libglib=2.70.2=hf1fb8c0_0
  - libiconv=1.16=haf1e3a3_0
  - libidn2=2.3.2=h0d85af4_0
  - liblief=0.11.5=he49afe7_0
  - libllvm12=12.0.1=hd011deb_2
  - libmamba=0.25.0=h3ac2a45_2
  - libmambapy=0.25.0=py39h85aca11_2
  - libnghttp2=1.47.0=h942079c_0
  - libpng=1.6.37=h7cec526_2
  - librsvg=2.50.7=hd2a7919_0
  - libsolv=0.7.22=hd9580d2_0
  - libssh2=1.10.0=h52ee1ee_0
  - libtiff=4.3.0=h1167814_0
  - libunistring=0.9.10=h0d85af4_0
  - libwebp-base=1.2.1=h0d85af4_0
  - libxml2=2.9.12=h93ec3fd_0
  - libxslt=1.1.33=h5739fc3_2
  - libzlib=1.2.11=h9173be1_1013
  - license-expression=1.2=py_0
  - lxml=4.8.0=py39h63b48b0_2
  - lz4-c=1.9.3=he49afe7_1
  - lzo=2.10=haf1e3a3_1000
  - mamba=0.25.0=py39ha435c47_2
  - markupsafe=2.1.1=py39h63b48b0_1
  - msrest=0.6.21=pyh44b312d_0
  - nbformat=5.1.3=pyhd8ed1ab_0
  - ncurses=6.3=h96cf925_1
  - nettle=3.6=hedd7734_0
  - oauthlib=3.1.1=pyhd8ed1ab_0
  - openssl=1.1.1q=hfe4f2af_0
  - pango=1.48.9=ha05cd14_0
  - patch=2.7.6=hbcf498f_1002
  - pcre=8.45=he49afe7_0
  - pcre2=10.37=ha16e1b2_0
  - perl=5.32.1=0_h0d85af4_perl5
  - pigz=2.6=h5dbffcc_0
  - pip=21.2.4=pyhd8ed1ab_0
  - pixman=0.40.0=hbcb3906_0
  - pkginfo=1.7.1=pyhd8ed1ab_0
  - prompt-toolkit=3.0.20=pyha770c72_0
  - prompt_toolkit=3.0.20=hd8ed1ab_0
  - psutil=5.9.2=py39ha30fb19_0
  - py-lief=0.11.5=py39h9fcab8e_0
  - pyasn1=0.4.8=py_0
  - pybind11-abi=4=hd8ed1ab_3
  - pycosat=0.6.3=py39h63b48b0_1010
  - pycparser=2.20=pyh9f0ad1d_2
  - pycrypto=2.6.1=py39h89e85a6_1006
  - pygithub=1.53=py_0
  - pygments=2.10.0=pyhd8ed1ab_0
  - pyjwt=1.7.1=py_0
  - pyopenssl=20.0.1=pyhd8ed1ab_0
  - pyrsistent=0.18.1=py39h63b48b0_1
  - pysocks=1.7.1=pyha2e5f31_6
  - python=3.9.13=h57e37ff_0_cpython
  - python-dateutil=2.8.2=pyhd8ed1ab_0
  - python-libarchive-c=4.0=py39h6e9494a_1
  - python-tzdata=2021.5=pyhd8ed1ab_0
  - python_abi=3.9=2_cp39
  - pytz=2021.1=pyhd8ed1ab_0
  - pytz-deprecation-shim=0.1.0.post0=py39h6e9494a_2
  - pyyaml=5.4.1=py39h701faf5_3
  - readline=8.1.2=h3899abd_0
  - reproc=14.2.3=h0d85af4_0
  - reproc-cpp=14.2.3=he49afe7_0
  - requests=2.28.1=pyhd8ed1ab_1
  - requests-oauthlib=1.3.0=pyh9f0ad1d_0
  - rich=10.16.1=pyhd8ed1ab_0
  - ripgrep=13.0.0=h244e342_0
  - rsa=4.7.2=pyh44b312d_0
  - ruamel.yaml=0.17.21=py39h63b48b0_1
  - ruamel.yaml.clib=0.2.6=py39h63b48b0_1
  - ruamel_yaml=0.15.80=py39h701faf5_1007
  - s3transfer=0.6.0=pyhd8ed1ab_0
  - scrypt=0.8.18=py39h6a41abd_3
  - setuptools=65.3.0=pyhd8ed1ab_1
  - six=1.16.0=pyh6c4a22f_0
  - smartmontools=7.2=h940c156_0
  - smmap=3.0.5=pyh44b312d_0
  - soupsieve=2.3.1=pyhd8ed1ab_0
  - sqlite=3.38.5=hd9f0692_0
  - tapi=1100.0.11=h9ce4665_0
  - tk=8.6.12=h5dbffcc_0
  - toolz=0.11.1=py_0
  - tornado=6.2=py39h701faf5_0
  - tqdm=4.62.2=pyhd8ed1ab_0
  - traitlets=5.1.0=pyhd8ed1ab_0
  - typing_extensions=3.10.0.0=pyha770c72_0
  - tzdata=2021e=he74cb21_0
  - tzlocal=4.2=py39h6e9494a_1
  - urllib3=1.26.6=pyhd8ed1ab_0
  - vsts-python-api=0.1.22=py_0
  - watchgod=0.7=pyhd8ed1ab_0
  - wcwidth=0.2.5=pyh9f0ad1d_2
  - wget=1.20.3=h52ee1ee_1
  - wheel=0.37.0=pyhd8ed1ab_1
  - wrapt=1.14.1=py39h701faf5_0
  - xz=5.2.5=haf1e3a3_1
  - yaml=0.2.5=haf1e3a3_0
  - yaml-cpp=0.7.0=hb486fe8_1
  - zipp=3.5.0=pyhd8ed1ab_0
  - zlib=1.2.11=h9173be1_1013
  - zstd=1.5.0=h582d3a0_0
prefix: /Users/mfansler/miniconda3